package service

import (
	"gdmin/global"
	"gdmin/model"
	"gdmin/servlet"
	"gdmin/utils"
	"gorm.io/gorm"
)

type UserBindService struct{}

func (s *UserBindService) BindDept(req *servlet.UserBindDeptReq) error {
	return global.DB.Transaction(func(tx *gorm.DB) error {
		err := removeBindDept(req.UserId, tx)
		if err != nil {
			return err
		}

		var deptBindUsers []model.DeptBindUser

		for _, deptId := range req.DeptIds {
			// 创建一个新的DeptBindUser结构体实例
			deptBindUser := model.DeptBindUser{
				UserId: req.UserId,
				DeptId: deptId,
				IsMain: req.MainDeptId == deptId, // 判断是否是主部门

			}
			deptBindUser.CreateUserId = utils.GetThreadUserId()
			deptBindUser.UpdateUserId = utils.GetThreadUserId()

			// 将创建的DeptBindUser实例添加到deptBindUsers切片中
			deptBindUsers = append(deptBindUsers, deptBindUser)
		}
		return tx.Model(&deptBindUsers).CreateInBatches(deptBindUsers, len(deptBindUsers)).Error
	})

}

func (s *UserBindService) BindRole(req *servlet.UserBindRoleReq) error {
	return global.DB.Transaction(func(tx *gorm.DB) error {
		err := removeBindRole(req.UserId, tx)
		if err != nil {
			return err
		}

		var roleBindUsers []model.RoleBindUser

		for _, roleId := range req.RoleIds {
			// 创建一个新的DeptBindUser结构体实例
			deptBindUser := model.RoleBindUser{
				UserId: req.UserId,
				RoleId: roleId,
			}
			deptBindUser.CreateUserId = utils.GetThreadUserId()
			deptBindUser.UpdateUserId = utils.GetThreadUserId()

			// 将创建的DeptBindUser实例添加到deptBindUsers切片中
			roleBindUsers = append(roleBindUsers, deptBindUser)
		}
		return tx.Model(&roleBindUsers).CreateInBatches(roleBindUsers, len(roleBindUsers)).Error
	})

}

func removeBindRole(userId int, tx *gorm.DB) error {
	var db []*model.RoleBindUser

	tx.Where("user_id =?", userId).Find(&db)
	if len(db) > 0 {

		for _, item := range db {
			item.UpdateUserId = utils.GetThreadUserId()
			item.IsDel = 1
		}
		return tx.Save(&db).Error
	}

	return nil
}

func removeBindDept(userId int, tx *gorm.DB) error {
	var db []*model.DeptBindUser

	tx.Where("user_id =?", userId).Find(&db)
	if len(db) > 0 {

		for _, item := range db {
			item.UpdateUserId = utils.GetThreadUserId()
			item.IsDel = 1
		}

		return tx.Save(&db).Error

	}

	return nil
}
